﻿/***  File Header  ************************************************************/
/**
* @file P4thDic.cpp
*
* P4th辞書ルーチン
* @author shozo fukuda
* @date   作成 Tue Feb 14 21:48:28 2006
* @date   修正 $Date: 06/04/18 14:34 $
* System  Generic <br>
*
*******************************************************************************/

/*******************************************************************************
* IMPORTS:
*******************************************************************************/
#include <string.h>
#include "Dic.h"
#include "P4th.h" /* 呼出用 */

/*******************************************************************************
* CONSTANT:
*******************************************************************************/

/*******************************************************************************
* TYPE:
*******************************************************************************/

/*******************************************************************************
* MACRO:
*******************************************************************************/

/*******************************************************************************
* GLOBAL VARIABLE:
*******************************************************************************/

/***  Module Header  ******************************************************}}}*/
/**
* ワード検索
* @par 解説
*   名前cstrを持つワードを辞書で検索し、そのワードのCFA返します。名前cstr
*   が見つからない場合は、0を返します。
*
* @retval 0以外 名前cstrを持つワードのPコード。
* @retval 0     名前cstrのワードが見つからなかった。
**/
/**************************************************************************{{{*/
Code P4th::Find(
UCHAR* cstr)        ///< (r) 検索対象の名前
{
  long n  = *cstr;    // 文字列の長さ
  Word wd = iCurrent; // ワード・ポインタ

  while (wd > 0) {
    if (strncmp((char*)cstr, (char*)Name(wd), n+1) == 0) {
      return W2CFA(wd);
    }
    wd = Next(wd);
  }
  return 0;
}

/***  Module Header  ******************************************************}}}*/
/**
* 新規ワードヘッダ割り当て
* @par 解説
*   mCode[]からメモリを獲得し新規ワード用ヘッダを作成します。リンクフィールドには
*   現在iCurrentが指すワードのインデックスを記入し、iCurrentは新規のヘッダを指す
*   ように更新します。名前フィールドとCODEフィールドも初期化します。
*
* @retval 割り当てたワードヘッダを指すインデックス
**/
/**************************************************************************{{{*/
Word P4th::Create()
{
  Word word = mDP;
  
  Build(iCurrent);
  Build(mNP);
  Build(0);
  
  iCurrent = word;

  return word;
}

/***  Module Header  ******************************************************}}}*/
/**
* 組み込み定数の検索
* @par 解説
*   カウント付き文字列mSymを名前に持つ組み込み定数を検索します。名前が一致する定
*   数が見つかればその値を引数valに書き込み、関数値としてtrueを返します。
*
* @par 定数名の文法
*   定数名前 := ルート名[メンバ名] <br>
*   ルート名 := &任意の文字列 <br>
*   メンバ名 := .任意の文字列 <br>
*   <br>
*   [例] &CONST, &ROOT.MEMBER
*
* @retval true  名前mSymに一致する定数が見つかった
* @retval false 名前mSymに一致する定数が見つからなかった
**/
/**************************************************************************{{{*/
bool P4th::FindConst(
long& val)          ///< (w) 検索結果の定数値
{
  long len = mSym[0];
  long next, last;
  P4thConst** c_dic;
  P4thConst*  c_list;
  
/*PRECONDITION*/
  if (len == 0
  ||  mSym[1] != '&') {
    return false;
  }
/* */

  next = 0; /*+TRICKY:shoz:06/02/24:メンバ定数の検索をスキップするために 0で初期化。 */

  for (c_dic  = _Const; *c_dic != 0; c_dic++) {
    for (c_list = *c_dic; c_list->mName != 0; c_list++) {
      if (c_list->mName[0] == '.' && next != 0) {
        // メンバ定数の検索
        last = MatchCStrStr(mSym, c_list->mName, next);
        if (last == (len + 1)) {
          val = c_list->mVal;
          return true;
        }

      } else if (c_list->mName[0] == '&') {
        // ルート定数の検索
        next = MatchCStrStr(mSym, c_list->mName, 1);
        if (next != 0) {
          if (next == (len + 1)) {
            val = c_list->mVal;
            return true;
  
          } else if (mSym[next] != '.') {
            /*+MEMO:shoz:06/02/24:末尾が'.'でないので、再度ルート定数を検索するようにする。*/
            next = 0;
          }
          
          /*+MEMO:shoz:06/02/24:ここで (next != 0) ならばメンバ定数の検索に進む。*/
        }
      }
    }
  }
  return false;
}

/* end of P4thDic.cpp */

